package business.util;

public class ValidadaCPF 
{
	private static String calcDigVerif(String num) 
	{  
		Integer primDig, segDig;  
		int soma = 0, peso = 10;
		
		for (int i = 0; i < num.length(); i++)
		{
			soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
		}
		   
		if (soma % 11 == 0 | soma % 11 == 1)  
			primDig = new Integer(0);  
		else  
			primDig = new Integer(11 - (soma % 11));  
		   
		soma = 0;  
		peso = 11;  
		for (int i = 0; i < num.length(); i++)  
			soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;  
		           
		soma += primDig.intValue() * 2;  
		
		if (soma % 11 == 0 | soma % 11 == 1)  
			segDig = new Integer(0);  
		else  
			segDig = new Integer(11 - (soma % 11));  
		   
		return primDig.toString() + segDig.toString();  
	}  
		   
//	private static int calcSegDig(String cpf, int primDig) 
//	{  
//		int soma = 0, peso = 11;  
//		
//		for (int i = 0; i < cpf.length(); i++)  
//			soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;  
//		           
//		soma += primDig * 2;  
//		
//		if (soma % 11 == 0 | soma % 11 == 1)  
//			return 0;  
//		else  
//			return 11 - (soma % 11);
//	}  
		   
	public static String geraCPF() 
	{  
		String iniciais = "";  
		Integer numero;  
		
		for (int i = 0; i < 9; i++) 
		{  
			numero = new Integer((int) (Math.random() * 10));  
			iniciais += numero.toString();  
		}  
		
		return iniciais + calcDigVerif(iniciais);
	}  
		   
	public static boolean validaCPF(String cpfOriginal) 
	{  
		/* Remove os caracters */ 
		String cpf = cpfOriginal.replaceAll("[^0-9]*", "");
		
		if (cpf.length() != 11)  
			return false;
		
		String numDig = cpf.substring(0, 9);
		
		return calcDigVerif(numDig).equals(cpf.substring(9, 11));
	}
	
	public static boolean validaCNPJ(String CNPJOriginal)
	{
		/* Remove os caracters */ 
		String cnpj = CNPJOriginal.replaceAll("[^0-9]*", "");
		
		/* Seleciona os d�gitos verificadores */
		int primeiroDigito = 0;
		int segundoDigito = 0;
		
		/* Resto */
		int resto = 0;
		
		/* Vari�veis para o calculo*/
		int constante;
		int soma;
		
		/* Resultado */
		boolean isValido = true;
		
		/* Verifica a quantidade de digitos do CNPJ informado. 
		 * Caso for diferente que 14 o CNPJ est� errado
		 */
		if (cnpj.length() != 14)
			return false;
		
		/* Calcula o segundo d�gito */
		constante = 6;
		soma = 0;
		for(int i = 0; i < (cnpj.length() - 1); i++)
		{
			soma += (Integer.parseInt(String.valueOf(cnpj.charAt(i))) * constante);
			
			
			if(constante == 2)
				constante = 9;
			else
				constante--;
		}
		
		/**
		 * Se o resto for 0 ou 1
		 * O primeiroDigito � igual [0] (zero)
		 * Se for 2, 3, 4, 5, 6, 7, 8, 9 ou 10
		 * O primeiroDigito � igual [11 - resto]
		 */
		resto = soma % 11;
		if( resto < 2 )
			primeiroDigito = 0;
		else
			primeiroDigito = 11 - resto;
		
		/* Calcula o primeiro d�gito */
		constante = 5;
		soma = 0;
		for(int i = 0; i < (cnpj.length() - 2); i++)
		{
			soma += (Integer.parseInt(String.valueOf(cnpj.charAt(i))) * constante);
						
			if(constante == 2)
				constante = 9;
			else
				constante--;
		}
		
		/**
		 * Se o resto for 0 ou 1
		 * O primeiroDigito � igual [0] (zero)
		 * Se for 2, 3, 4, 5, 6, 7, 8, 9 ou 10
		 * O primeiroDigito � igual [11 - resto]
		 */
		resto = soma % 11;
		if( resto < 2 )
			segundoDigito = 0;
		else
			segundoDigito = 11 - resto;
		
		
		if(primeiroDigito != Integer.parseInt(String.valueOf(cnpj.charAt(12))) )
			isValido = false;
		else
		if(segundoDigito != Integer.parseInt(String.valueOf(cnpj.charAt(13))) )
			isValido = false;
		
		return isValido;
	}
}
